package com.yzt.zhuju.utils.map;

import android.util.Log;

import com.baidu.location.BDAbstractLocationListener;
import com.baidu.location.BDLocation;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.model.LatLng;
import com.yzt.zhuju.utils.Utils;

/**
 * 百度地图定位工具类
 */
public class BdLocationUtil {

    private String checkCity = "";

    private int cityCode = 0;

    private int cityChooseCode = 0;

    private String lat;

    private String lng;

    public int getCityChooseCode() {
        return cityChooseCode;
    }

    public void setCityChooseCode(int cityChooseCode) {
        this.cityChooseCode = cityChooseCode;
    }

    public int getCityCode() {
        if (getCityChooseCode() != 0){
            return getCityChooseCode();
        }else{
            return cityCode;
        }
    }

    public void setCityCode(int cityCode) {
        this.cityCode = cityCode;
    }

    public String getLat() {
        return lat;
    }

    public void setLat(String lat) {
        this.lat = lat;
    }

    public String getLng() {
        return lng;
    }

    public void setLng(String lng) {
        this.lng = lng;
    }

    public String getCheckCity() {
        return checkCity;
    }

    public void setCheckCity(String checkCity) {
        this.checkCity = checkCity;
    }

    /**
     * 单例
     */
    public static BdLocationUtil getInstance() {
        return LocationHolder.INSTANCE;
    }

    private static class LocationHolder {
        private static final BdLocationUtil INSTANCE = new BdLocationUtil();
    }

    /**
     * 定位回调的接口
     */
    public interface MyLocationListener {
        void myLocation(BDLocation location);
    }

    private static final double x_pi = 3.14159265358979324 * 3000.0 / 180.0;

    public static LatLng bd2gd(double lat, double lng) {

//        double x = lng - 0.0065, y = lat - 0.006;
//
//        double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);
//
//        double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);
//
//        double gg_lng = z * Math.cos(theta);
//
//        double gg_lat = z * Math.sin(theta);

        return new LatLng(lat, lng);
    }

    /**
     * 获取当前位置
     */
    public void requestLocation(final MyLocationListener listener) {
        try {
            //定位服务的客户端。宿主程序在客户端声明此类，并调用，目前只支持在主线程中启动
            final LocationClient locationClient = new LocationClient(Utils.getApp());
            // 注册位置监听器
            locationClient.registerLocationListener(new BDAbstractLocationListener() {
                @Override
                public void onReceiveLocation(BDLocation location) {
                    // 百度转高德经纬度
//                LatLng latLng = bd2gd(location.getLatitude(), location.getLongitude());
//                location.setLatitude(latLng.latitude);
//                location.setLongitude(latLng.longitude);
                    lat = String.valueOf(location.getLatitude());
                    lng = String.valueOf(location.getLongitude());
                    cityCode = Integer.parseInt(location.getCityCode());
                    listener.myLocation(location);
                    locationClient.stop();
                }
            });
//声明LocationClient类实例并配置定位参数
            LocationClientOption locationOption = new LocationClientOption();
//注册监听函数
//可选，默认高精度，设置定位模式，高精度，低功耗，仅设备
            locationOption.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
//可选，默认gcj02，设置返回的定位结果坐标系，如果配合百度地图使用，建议设置为bd09ll;
            //   locationOption.setCoorType("gcj02");
            locationOption.setCoorType("bd09ll");
//可选，默认0，即仅定位一次，设置发起连续定位请求的间隔需要大于等于1000ms才是有效的
            locationOption.setScanSpan(5000);
//可选，设置是否需要地址信息，默认不需要
            locationOption.setIsNeedAddress(true);
//可选，设置是否需要地址描述
            locationOption.setIsNeedLocationDescribe(true);
//可选，设置是否需要设备方向结果
            locationOption.setNeedDeviceDirect(false);
//可选，默认false，设置是否当Gnss有效时按照1S1次频率输出Gnss结果
            locationOption.setLocationNotify(true);
//可选，默认true，定位SDK内部是一个SERVICE，并放到了独立进程，设置是否在stop的时候杀死这个进程，默认不杀死
            locationOption.setIgnoreKillProcess(true);
//可选，默认false，设置是否需要位置语义化结果，可以在BDLocation.getLocationDescribe里得到，结果类似于“在北京天安门附近”
            locationOption.setIsNeedLocationDescribe(true);
//可选，默认false，设置是否需要POI结果，可以在BDLocation.getPoiList里得到
            locationOption.setIsNeedLocationPoiList(true);
//可选，默认false，设置是否收集CRASH信息，默认收集
            locationOption.SetIgnoreCacheException(false);
//可选，默认false，设置是否开启卫星定位
//        locationOption.setOpenGnss(true);
            locationOption.setOpenGps(true);
//可选，默认false，设置定位时是否需要海拔信息，默认不需要，除基础定位版本都可用
            locationOption.setIsNeedAltitude(false);
//设置打开自动回调位置模式，该开关打开后，期间只要定位SDK检测到位置变化就会主动回调给开发者，该模式下开发者无需再关心定位间隔是多少，定位SDK本身发现位置变化就会及时回调给开发者
            locationOption.setOpenAutoNotifyMode();
//设置打开自动回调位置模式，该开关打开后，期间只要定位SDK检测到位置变化就会主动回调给开发者
            locationOption.setOpenAutoNotifyMode(3000, 1, LocationClientOption.LOC_SENSITIVITY_HIGHT);
//需将配置好的LocationClientOption对象，通过setLocOption方法传递给LocationClient对象使用
            locationClient.setLocOption(locationOption);
//开始定位
            locationClient.start();

            /*
             * 当所设的整数值大于等于1000（ms）时，定位SDK内部使用定时定位模式。调用requestLocation(
             * )后，每隔设定的时间，定位SDK就会进行一次定位。如果定位SDK根据定位依据发现位置没有发生变化，就不会发起网络请求，
             * 返回上一次定位的结果；如果发现位置改变，就进行网络请求进行定位，得到新的定位结果。
             * 定时定位时，调用一次requestLocation，会定时监听到定位结果。
             */
            locationClient.requestLocation();
        } catch (Exception e) {
            Log.e("tag", "map---->" + e.getMessage());
        }
    }
}
